home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / xml2po < prev    next >
Text File  |  2009-09-22  |  7KB  |  188 lines

  1. #!/usr/bin/python
  2. # -*- encoding: utf-8 -*-
  3. # Copyright (c) 2004, 2005, 2006 Danilo ┼áegan <danilo@gnome.org>.
  4. # Copyright (c) 2009 Claude Paroz <claude@2xlibre.net>.
  5. #
  6. # This file is part of xml2po.
  7. #
  8. # xml2po is free software; you can redistribute it and/or modify
  9. # it under the terms of the GNU General Public License as published by
  10. # the Free Software Foundation; either version 2 of the License, or
  11. # (at your option) any later version.
  12. #
  13. # xml2po is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. # GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with xml2po; if not, write to the Free Software Foundation, Inc.,
  20. # 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21. #
  22.  
  23. # xml2po -- translate XML documents
  24. VERSION = "0.18.0"
  25.  
  26. # Versioning system (I use this for a long time, so lets explain it to
  27. # those Linux-versioning-scheme addicts):
  28. #   1.0.* are unstable, development versions
  29. #   1.1 will be first stable release (release 1), and 1.1.* bugfix releases
  30. #   2.0.* will be unstable-feature-development stage (milestone 1)
  31. #   2.1.* unstable development betas (milestone 2)
  32. #   2.2 second stable release (release 2), and 2.2.* bugfix releases
  33. #   ...
  34. #
  35. import sys
  36. import os
  37. import getopt
  38.  
  39. NULL_STRING = '/dev/null'
  40. if not os.path.exists('/dev/null'): NULL_STRING = 'NUL'
  41.  
  42. def usage (with_help = False):
  43.     print >> sys.stderr, "Usage:  %s [OPTIONS] [XMLFILE]..." % (sys.argv[0])
  44.     if with_help:
  45.         print >> sys.stderr, """
  46. OPTIONS may be some of:
  47.     -a    --automatic-tags     Automatically decides if tags are to be considered
  48.                                  "final" or not
  49.     -k    --keep-entities      Don't expand entities
  50.     -e    --expand-all-entities  Expand ALL entities (including SYSTEM ones)
  51.     -m    --mode=TYPE          Treat tags as type TYPE (default: docbook)
  52.     -o    --output=FILE        Print resulting text (XML or POT) to FILE
  53.     -p    --po-file=FILE       Specify PO file containing translation, and merge
  54.                                  Overwrites temporary file .xml2po.mo.
  55.     -r    --reuse=FILE         Specify translated XML file with the same structure
  56.     -t    --translation=FILE   Specify MO file containing translation, and merge
  57.     -u    --update-translation=LANG.po   Updates a PO file using msgmerge program
  58.  
  59.     -l    --language=LANG      Set language of the translation to LANG
  60.           --mark-untranslated  Set 'xml:lang="C"' on untranslated tags
  61.  
  62.     -v    --version            Output version of the xml2po program
  63.  
  64.     -h    --help               Output this message
  65.  
  66. EXAMPLES:
  67.     To create a POTemplate book.pot from input files chapter1.xml and
  68.     chapter2.xml, run the following:
  69.         %(command)s -o book.pot chapter1.xml chapter2.xml
  70.  
  71.     After translating book.pot into de.po, merge the translations back,
  72.     using -p option for each XML file:
  73.         %(command)s -p de.po chapter1.xml > chapter1.de.xml
  74.         %(command)s -p de.po chapter2.xml > chapter2.de.xml
  75. """ % {'command': sys.argv[0]}
  76.  
  77.  
  78. def main(argv):
  79.     if not argv:
  80.         usage()
  81.         sys.exit(2)
  82.  
  83.     name = os.path.join(os.path.dirname(__file__), '..')
  84.     if os.path.exists(os.path.join(name, 'tests')):
  85.         print >> sys.stderr, 'Running from source folder, modifying PYTHONPATH'
  86.         sys.path.insert(0, name)
  87.  
  88.     from xml2po import Main
  89.  
  90.     # Default parameters
  91.     default_mode = 'docbook'
  92.     operation = 'pot' # 'pot', 'merge', 'update'
  93.     output  = '-' # this means to stdout
  94.     options = {
  95.         'mark_untranslated'   : False,
  96.         'expand_entities'     : True,
  97.         'expand_all_entities' : False,
  98.     }
  99.     origxml = ''
  100.     mofile = ''
  101.  
  102.     try: opts, remaining_args = getopt.getopt(argv, 'avhkem:t:o:p:u:r:l:',
  103.                                ['automatic-tags','version', 'help', 'keep-entities', 'expand-all-entities', 'mode=', 'translation=',
  104.                                 'output=', 'po-file=', 'update-translation=', 'reuse=', 'language=', 'mark-untranslated' ])
  105.     except getopt.GetoptError:
  106.         usage(True)
  107.         sys.exit(2)
  108.  
  109.     for opt, arg in opts:
  110.         if opt in ('-m', '--mode'):
  111.             default_mode = arg
  112.         if opt in ('-a', '--automatic-tags'):
  113.             default_mode = 'basic'
  114.         elif opt in ('-k', '--keep-entities'):
  115.             options['expand_entities'] = False
  116.         elif opt in ('--mark-untranslated',):
  117.             options['mark_untranslated'] = True
  118.         elif opt in ('-e', '--expand-all-entities'):
  119.             options['expand_all_entities'] = True
  120.         elif opt in ('-l', '--language'):
  121.             options['translationlanguage'] = arg
  122.         elif opt in ('-t', '--translation'):
  123.             mofile = arg
  124.             operation = 'merge'
  125.             if 'translationlanguage' not in options:
  126.                 options['translationlanguage'] = os.path.split(os.path.splitext(mofile)[0])[1]
  127.         elif opt in ('-r', '--reuse'):
  128.             origxml = arg
  129.         elif opt in ('-u', '--update-translation'):
  130.             operation = 'update'
  131.             po_to_update = arg
  132.         elif opt in ('-p', '--po-file'):
  133.             mofile = ".xml2po.mo"
  134.             pofile = arg
  135.             operation = 'merge'
  136.             if 'translationlanguage' not in options:
  137.                 options['translationlanguage'] = os.path.split(os.path.splitext(pofile)[0])[1]
  138.             os.system("msgfmt -o %s %s >%s" % (mofile, pofile, NULL_STRING)) and sys.exit(7)
  139.         elif opt in ('-o', '--output'):
  140.             output = arg
  141.         elif opt in ('-v', '--version'):
  142.             print VERSION
  143.             sys.exit(0)
  144.         elif opt in ('-h', '--help'):
  145.             usage(True)
  146.             sys.exit(0)
  147.  
  148.     if operation == 'update' and output != "-":
  149.         print >> sys.stderr, "Option '-o' is not yet supported when updating translations directly. Ignoring this option."
  150.  
  151.     # Treat remaining arguments as XML files
  152.     filenames = []
  153.     while remaining_args:
  154.         filenames.append(remaining_args.pop())
  155.  
  156.     try:
  157.         xml2po_main = Main(default_mode, operation, output, options)
  158.     except IOError:
  159.         print >> sys.stderr, "Error: cannot open file %s for writing." % (output)
  160.         sys.exit(5)
  161.  
  162.     if operation == 'merge':
  163.         if len(filenames) > 1:
  164.             print  >> sys.stderr, "Error: You can merge translations with only one XML file at a time."
  165.             sys.exit(2)
  166.  
  167.         if not mofile:
  168.             print >> sys.stderr, "Error: You must specify MO file when merging translations."
  169.             sys.exit(3)
  170.  
  171.         xml2po_main.merge(mofile, filenames[0])
  172.  
  173.     elif operation == 'update':
  174.         xml2po_main.update(filenames, po_to_update)
  175.  
  176.     elif origxml:
  177.         xml2po_main.reuse(origxml, filenames[0])
  178.  
  179.     else:
  180.         # Standard POT producing
  181.         xml2po_main.to_pot(filenames)
  182.  
  183. # Main program start
  184. if __name__ == '__main__':
  185.     main(sys.argv[1:])
  186. else:
  187.     raise NotImplementedError
  188.